#include<curses.h>
#include<locale.h>
#include<stdlib.h>
#define LEFT 1
#define RIGHT -1
struct People{
  int lie;
  int hang;
};
struct Food{
  int hang;
  int lie;
};
struct People rich;
struct Food food[1000];
struct Food bomb[2001];
int key;
int money=0;
int num=0;
int dir=0;
int p=0;
void initNcurse(){
  setlocale(LC_ALL,"");
  initscr();
  keypad(stdscr,1);
  noecho();
}
void initRich(){
  rich.hang=19;
  rich.lie=1;
}
void initBomb(){
  int i;
  for(i=0;i<10;i++){
    bomb[i].hang=1;
    bomb[i].lie=rand()%19;
  }
}
void initFood(){
  int i;
  for(i=0;i<50;i++){
    food[i].hang=0;
    food[i].lie=rand()%19;
  }
}
int hasBomb(int i,int j){
  int n;
  for(n=0;n<num/5;n++){
  if(bomb[n].hang==i&&bomb[n].lie==j) return 1;
  }
  return 0;
}
int hasPeople(int i,int j){
  if(rich.hang==i&&rich.lie==j) return 1;
  return 0;
}
int hasFood(int i,int j){
  int n=0;
  while(n<num){
    if(food[n].hang==i && food[n].lie==j) return 1;
    n++;
  }
  return 0;
}
void gamePic(){
  int hang;
  int lie;
  move(0,0);
  for(hang=0;hang<=20;hang++){
    if(hang==0){
      for(lie=0;lie<=20;lie++){
        printw("#");
      }
      printw("Ctrl+c is quit...");
      printw("\n");
    }
    if(hang>0&&hang<20){
      for(lie=0;lie<=20;lie++)
      {
        if(lie==0||lie==20) printw("#");
        else if(hasFood(hang,lie)) printw("$");
        else if(hasBomb(hang,lie)) printw("*");
        else if(hasPeople(hang,lie))printw("v");
        else printw(" ");
      }
      if(hang==1&&lie==21) printw("$:50￥ *:-30￥");
      if(hang==2&&lie==21) printw("Rich's tatal money: %d",money);
      printw("\n");
    }
    if(hang==20){
      for(lie=1;lie<=20;lie++) printw("#");
    }
  }
}
void moveFood(){
  int n=0;
  for(n=0;n<num;n++){
    int x=food[n].hang+1;
    food[n].hang=x;
    if(food[n].hang==rich.hang&&food[n].lie==rich.lie) money+=50;
  }
}
void moveBomb(){
  int n;
  for(n=0;n<num/5;n++){
    int x=bomb[n].hang+1;
    bomb[n].hang=x;
    if(bomb[n].hang==rich.hang&&bomb[n].lie==rich.lie) money-=30;
  }
}
void moveRich(){
  int x=rich.lie;
  rich.lie=(x+dir)%19;
  dir=0;
}
void refreshJieMian(){
  while(1){
    if(p%2==0) num++;
    moveFood();
    if(num>5) moveBomb();
    moveRich();
    gamePic();
    p++;
    refresh();
    usleep(150000);
    if(num==68) pthread_exit();
  }
}
void changeDir(){
  while(1){
    key=getch();
    switch(key){
      case KEY_LEFT:
        dir=-1;
            break;
      case KEY_RIGHT:
        dir=1;
            break;
    }
  }
}
void startJieMian(){
  move(1,0);
  printw("\n");
  printw("  <<----------大富翁简易版---------->>\n");
  printw("       游戏规则如下:\n");
  printw("       游戏中*代表炸弹,$代表钱,v代表富翁\n");
  printw("       用户通过键盘左右控制富翁v移动\n");
  printw("       富翁接到$则财富+50,同样接到*财富-30\n");
  printw("       s:开始游戏          Ctrl+c:退出游戏");
  refresh();
}
int main(){
  int a=2;
  pthread_t t1;
  pthread_t t2;
  initNcurse();
  startJieMian();
  int c=getch();
  while(1){
    if(c=='s') break;
    c=getch();
  }
  initRich();
  initFood();
  initBomb();
  gamePic();
  pthread_create(&t1,NULL,refreshJieMian,NULL);
  pthread_create(&t2,NULL,changeDir,NULL);
  while(1);
  getch();
  endwin();
}
